Search K
Appearance
Appearance
目前 TCP/IP 协议可以说是名气最大、使用最广泛的计算机网络,从这篇文章来会讲解 TCP 协议的历史和分层模型。将分以下两个部分
接下来我们来讲讲 TCP/IP 协议的历史。
时间回退到 1969 年,当时的 Internet 还是一个美国国防部高级研究计划局(Advanced Research Projects Agency,ARPA)研究的非常小的网络,被称为 ARPANET(Advanced Research Project Agency Network)。
比较流行的说法是美国担心敌人会摧毁他们的通信网络,于是下决心要建立一个高可用的网络,即使部分线路或者交换机的故障不会导致整个网络的瘫痪。于是 ARPA 建立了著名的 ARPANET。
ARPANET 最早只是一个单个的分组交换网,后来发展成为了多个网络的互联技术,促成了互联网的出现。现代计算机网络的很多理念都来自 ARPANET,1983 年 TCP/IP 协议成为 ARPANET 上的标准协议,使得所有使用 TCP/IP 协议的计算机都能互联,因此人们把 1983 年当做互联网诞生的元年。
从字面上来看,很多人会认为 TCP/IP 是 TCP、IP 这两种协议,实际上 TCP/IP 协议族指的是在 IP 协议通信过程中用到的协议的统称
记得在学习计算机网络课程的时候,一上来就开始讲分层模型了,当时死记硬背的各个层的名字很快就忘光了,不明白到底分层有什么用。纵观计算机和分布式系统,你会发现「计算机的问题都可以通过增加一个虚拟层来解决,如果不行,那就两个」
下面用 wireshark 抓包的方式来开始看网络分层。
打开 wireshark,在弹出的选项中,选中 en0 网卡,在过滤器中输入 host www.baidu.com,只抓取与百度服务器通信的数据包。

在命令行中用 curl 命令发起 http 请求:curl http://www.baidu.com,抓到的中间一次数据包如下

可以看到协议的分层从上往下依次是

应用层的本质是规定了应用程序之间如何相互传递报文,以 HTTP 协议为例,它规定了
很多应用层协议都是由 RFC 文档定义,比如 HTTP 的 RFC 为 RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1。
HTTP 客户端和 HTTP 服务端的首要工作就是根据 HTTP 协议的标准组装和解析 HTTP 数据包,每个 HTTP 报文格式由三部分组成:
GET / HTTP/1.1,表示这是一个 GET 请求,请求的 URL 为 /,协议版本为 HTTP 1.1,起始行最后会有一个空行 CRLF(\r\n) 与下面的首部分隔开key:value 的方式,比如常见的 User-Agent、ETag、Content-Length 都属于 HTTP 首部,每个首部直接也是用空行分隔以本例的请求报文格式为例

除了我们熟知的 HTTP 协议,还有下面这些非常常用的应用层协议
传输层的作用是为两台主机之间的「应用进程」提供端到端的逻辑通信,相隔几千公里的两台主机的进程就好像在直接通信一样。
虽然是叫传输层,但是并不是将数据包从一台主机传送到另一台,而是对「传输行为进行控制」,这本小册介绍的主要内容 TCP 协议就被称为传输控制协议(Transmission Control Protocol),为下面两层协议提供数据包的重传、流量控制、拥塞控制等。

假设你正在电脑上用微信跟女朋友聊天,用 QQ 跟技术大佬们讨论技术细节,当电脑收到一个数据包时,它怎么知道这是一条微信的聊天内容,还是一条 QQ 的消息呢?
这就是端口号的作用。传输层用端口号来标识不同的应用程序,主机收到数据包以后根据目标端口号将数据包传递给对应的应用程序进行处理。比如这个例子中,目标端口号为 80,百度的服务器就根据这个目标端口号将请求交给监听 80 端口的应用程序(可能是 Nginx 等负载均衡器)处理

网络互连层提供了主机到主机的通信,将传输层产生的的数据包封装成分组数据包发送到目标主机,并提供路由选择的能力

IP 协议是网络层的主要协议,TCP 和 UDP 都是用 IP 协议作为网络层协议。这一层的主要作用是给包加上源地址和目标地址,将数据包传送到目标地址。
IP 协议是一个无连接的协议,也不具备重发机制,这也是 TCP 协议复杂的原因之一就是基于了这样一个「不靠谱」的协议。
网络访问层也有说法叫做网络接口层,以太网、Wifi、蓝牙工作在这一层,网络访问层提供了主机连接到物理网络需要的硬件和相关的协议。这一层我们不做重点讨论。
整体的分层图如下图所示

分层的本质是通过分离关注点而让复杂问题简单化,通过分层可以做到: